<?php

/**
 * 队列类
 * @copyright Copyright&copy; 2015, 广州六象元一网络科技有限公司
 * @author 王海龙 $
 * @version  $Id: classQueue.php, v 1.0, 2015-01-01 王海龙 $
 * 基本操作：
 * $mem            memcached实例化
 */

class classQueue {
    public $mem; // memcached
    private $maxCount = 100; // 错误最大循环次数
    private $usleep = 10000; // 循环回调执行间隔/微秒
    private $config = array('512145b6f8ea49a5.m.cnqdalicm9pub001.ocs.aliyuncs.com', 11211, '512145b6f8ea49a5', 'Eggms520');
    /**
     * 构造函数
     *
     * @param   array   配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...);
     */
    public function __construct($config = array()) {
        if (empty($config)) {
            $config = $this->config;
        }
        $this->connect($config);
    }

    /**
     * memcached连接
     *
     * @access  private
     * @param   array   配置数组
     * @return  boolean
     */
    private function connect($config = array()) {
        $this->mem = new memcached();
        // 以二进制进行传输，当要进行密码验证时，这个一定要为true
        $this->mem->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
        // 添加服务池
        $this->mem->addServer($config[0], $config[1]);
        // 进行密码验证
        $this->mem->setSaslAuthData($config[2], $config[3]);
        // 取消自动压缩，如果要后面追加数据，不可压缩数据
        $this->mem->setOption(Memcached::OPT_COMPRESSION, false);
    }

    /**
     * 添加队列
     * @access  public
     * @param   $name  string  队列名称
     * @param   $value int     队列初始值
     * @param   $timeOut int   队列有效时间/秒
     * @return  bool  返回是否成功
     */
    public function add($name = false, $value = 0, $timeOut = 86400) {
        if (!empty($name)) {
            $count = 0;
            $strValue = json_encode($value) . '||';
            while ($count < $this->maxCount){
                // 添加队列
                if ($this->mem->add($name, $strValue, $timeOut)) {
                    // 添加成功
                    return true;
                    break;
                } else {
                    // 添加失败
                    // 查看是否已有队列
                    $int = $this->mem->get($name);
                    if (!empty($int) || $int == '0') {
                        // 已有队列则返回TRUE
                        return true;
                        break;
                    } else {
                        usleep($this->usleep);
                        $count ++;
                    }
                }
            }
        }
        return false;
    }

    /**
     * 追加队列数据
     * @access  public
     * @param   $name  string  队列名称
     * @param   $value int     追加的值
     * @return  bool  返回是否成功
     */
    public function append($name = false, $value = 0) {
        if (!empty($name)) {
            $count = 0;
            // 转换数据
            $strValue = json_encode($value) . '||';
            while ($count < $this->maxCount){
                // 追加数据
                if ($this->mem->append($name, $strValue)) {
                    // 追加成功
                    return true;
                    break;
                } elseif ($this->mem->add($name, $strValue, 86400)) {
                    // 尝试添加队列
                    return true;
                    break;
                } else {
                    usleep($this->usleep);
                    $count ++;
                }
            }
        }
        return false;
    }
    /**
     * 删除队列
     * @access  public
     * @param   $name  string  队列名称
     * @return  bool  返回是否成功
     */
    public function del($name = false) {
        if (!empty($name)) {
            $count = 0;
            while ($count < $this->maxCount){
                // 删除队列
                if ($this->mem->delete($name)) {
                    // 删除成功
                    return true;
                    break;
                } else {
                    if (!$this->mem->get($name)) {
                        // 不存在队列
                        return true;
                        break;
                    }
                    usleep($this->usleep);
                    $count ++;
                }
            }
        }
        return false;
    }
    /**
     * 获取队列的数据
     * @access  public
     * @param   $name  string  队列名称
     * @return  bool  返回是否成功
     */
    public function get($name = false) {
        if (!empty($name)) {
            $count = 0;
            while ($count < $this->maxCount){
                if ($data = $this->mem->get($name)) {
                    $data = array_filter(explode('||', $data));
                    foreach ($data as $key => $value) {
                        $data[$key] = json_decode($value,true);
                    }
                    return $data;
                    break;
                } else {
                    usleep($this->usleep);
                    $count ++;
                }
            }
        }
        return array();
    }









}
